/***********************************************************************************************************
 *** @Author         : jiabao
 *** @Description    : 文件描述符重定向
 *** @Date           : 2023-12-09 16:59:25
 *** @FilePath       : /demo_cc/character/redirect/src/main.cpp
 ***********************************************************************************************************/
#include <unistd.h>
#include <iostream>
#include <string>
#include <fcntl.h>
using namespace std;
/***********************************************************************************************************
 *** @Description:  标准输入重定向，cin不再从终端输入，而是从文件输入
 *** @return {void}
 ***********************************************************************************************************/
void stdin_redirect()
{
    string path = "../file/in.txt";
    int fd = -1;
    if ((fd = open(path.c_str(), O_RDWR)) == -1)
    {
        cout << "open " << path << " fail!" << endl;
    }
    dup2(fd, 0); // 标准输入重定向到fd
    // dup2(0, fd); //fd重定向到标准输入,原以为在in.txt写入会打印，结果不会,这样的话就是使用read和cin的效果一样
    string s;
    while (cin >> s)
    {
        cout << s << endl;
    }
    // while (getline(cin, s)) // 用getline从标准输入中获取数据
    // {
    //     cout << s << endl; // 通过标准输出将读入的数据打印出来
    // }
    close(fd);
}
/***********************************************************************************************************
 *** @Description:  标准输出重定向，cout不再从终端输出，而是输出到文件中
 *** @return {void}
 ***********************************************************************************************************/
void stdout_redirect()
{
    /*
        返回最小可用的描述符，重定向到1，也就是标准输出,写fd也就是标准输出
    */

    int fd = dup(1);
    string s = "hello world\n";
    write(fd, s.c_str(), s.length());
    close(fd);

    string path = "../file/out.txt";
    if ((fd = open(path.c_str(), O_RDWR | O_CREAT | O_TRUNC)) == -1)
    {
        cout << "open " << path << " fail!" << endl;
    }
    dup2(fd, 1); // 把标准输出重定向到fd，操作标准输出也就是操作fd
    cout << s << endl;
    close(fd);
}
int main()
{
    stdin_redirect();
    stdout_redirect();

    return 0;
}